package implementacion;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;

import excepciones.ElementoEnConjunto;
import excepciones.NoElementoEnConjunto;

public class Usuarios {

	private EntityManager em;

	public Usuarios(EntityManager em) {
		this.em = em;
	}

	public void anyadirUsuario(Usuario usuario) {
		if (usuario != null)
			if (!existeUsuario(usuario.getEmail()))
				em.persist(usuario);
			else
				throw new ElementoEnConjunto(
						"Ya existe un usuario registrado con ese email");
		else
			throw new IllegalArgumentException("Error al registrarse");
	}

	public boolean existeUsuario(String email) {
		if (!email.equals("")) {
			boolean existe = false;
			if (em.find(Usuario.class, email) != null)
				existe = true;
			return existe;
		} else
			throw new IllegalArgumentException();
	}

	public void eliminarUsuario(String email) {
		if (!email.equals("") && existeUsuario(email)) {
			Usuario usuario = em.find(Usuario.class, email);
			String query = "SELECT infoRuta FROM InfoRuta infoRuta WHERE infoRuta.usuario='"
					+ usuario.getEmail() + "'";
			List<InfoRuta> infoRutas = em.createQuery(query, InfoRuta.class)
					.getResultList();
			for (InfoRuta infoRuta : infoRutas) {
				InfoRutas infoRutasAux = new InfoRutas(em);
				infoRutasAux.eliminarInfoRuta(infoRuta.getIdInfoRuta());
			}
			List<Usuario> amigos = usuario.getAmigos();
			for (int i = 0; 0 < amigos.size(); i++)
				eliminarAmigo(email, amigos.get(i).getEmail());
			String query2 = "SELECT comentario FROM Comentario comentario WHERE comentario.usuario='"
					+ email + "'";
			List<Comentario> comentarios = em.createQuery(query2,
					Comentario.class).getResultList();
			for (Comentario comentario : comentarios) {
				Comentarios comentariosAux = new Comentarios(em);
				comentariosAux.eliminarComentario(comentario.getIdComentario());
			}
			em.remove(usuario);
		} else
			throw new IllegalArgumentException();
	}

	public void modificarUsuario(Usuario usuario) {
		if (usuario != null) {
			Usuario usuarioAux = em.find(Usuario.class, usuario.getEmail());
			if (usuarioAux != null) {
				usuarioAux.setNombre(usuario.getNombre());
				usuarioAux.setApellidos(usuario.getApellidos());
				usuarioAux.setContrasenya(usuario.getContrasenya());
				usuarioAux.setAltura(usuario.getAltura());
				usuarioAux.setPeso(usuario.getPeso());
				usuarioAux.setEdad(usuario.getEdad());
			} else
				throw new IllegalArgumentException();
		} else
			throw new IllegalArgumentException();
	}

	public boolean autentificarUsuario(String email, String contrasenya) {
		boolean logueado = false;
		String query = "SELECT usuario FROM Usuario usuario WHERE usuario.email='"
				+ email + "' AND usuario.contrasenya='" + contrasenya + "'";
		Usuario usuario = em.createQuery(query, Usuario.class)
				.getSingleResult();
		if (usuario != null)
			logueado = true;
		return logueado;

	}

	public List<Usuario> buscarUsuario(String cadena) {

		List<Usuario> coincidencias = new ArrayList<Usuario>();
		String query = "SELECT usuario FROM Usuario usuario";
		List<Usuario> usuarios = em.createQuery(query, Usuario.class)
				.getResultList();
		for (Usuario usuario : usuarios) {
			if (usuario.getNombre().contains(cadena)
					|| usuario.getApellidos().contains(cadena))
				coincidencias.add(usuario);
		}
		return coincidencias;
	}

	public void anyadirAmigo(String emailUsuario, String emailAmigo) {
		if (emailAmigo != "" && emailUsuario != "")
			if (existeUsuario(emailUsuario) && existeUsuario(emailAmigo)) {
				Usuario usuario = em.find(Usuario.class, emailUsuario);
				Usuario amigo = em.find(Usuario.class, emailAmigo);
				if (!existeAmistad(usuario, amigo)) {
					usuario.getAmigos().add(amigo);
					em.persist(usuario);
				} else
					throw new ElementoEnConjunto();
			} else
				throw new NoElementoEnConjunto();
		else
			throw new IllegalArgumentException();
	}

	public void eliminarAmigo(String emailUsuario, String emailAmigo) {
		if (!emailAmigo.equals("") && !emailUsuario.equals(""))
			if (existeUsuario(emailUsuario) && existeUsuario(emailAmigo)) {
				Usuario usuario = em.find(Usuario.class, emailUsuario);
				Usuario amigo = em.find(Usuario.class, emailAmigo);
				if (existeAmistad(usuario, amigo)) {
					usuario.getAmigos().remove(amigo);
					amigo.getAmigos().remove(usuario);
					em.persist(usuario);
					em.persist(amigo);
				} else
					throw new NoElementoEnConjunto();
			} else
				throw new NoElementoEnConjunto();
		else
			throw new IllegalArgumentException();
	}

	private boolean existeAmistad(Usuario usuario, Usuario amigo) {
		if (usuario != null && amigo != null)
			return usuario.getAmigos().contains(amigo);
		else
			throw new IllegalArgumentException();
	}

	public List<Usuario> mostrarAmigos(String emailUsuario) {
		if (!emailUsuario.equals("")) {
			Usuario usuario = em.find(Usuario.class, emailUsuario);
			List<Usuario> amigos = usuario.getAmigos();
			return amigos;
		} else
			throw new IllegalArgumentException();
	}

	public Usuario obtenerUsuario(String email) {
		if (!email.equals("")) {
			Usuario usuario = em.find(Usuario.class, email);
			return usuario;
		} else
			throw new IllegalArgumentException();
	}
}
